import axios from "axios";
//缓存都存在这个对象-这样的好处是一刷新，所有的都没了，可以起到刷新强制更新页面的作用
const cacheStore = {

};

//创建axios实例
const requestInstance = axios.create({ //配置新建一个实例,`baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL
    baseURL: "http://localhost:8000/"
})



//在响应拦截中自动加入缓存
requestInstance.interceptors.response.use((res) => {  //在对响应数据做点什么  .request.use在发送请求之前做些什么
    console.log('RES', res);
    //为了让使用者用起来和真正的接口的返回res数据结构没有区别，磨平差异。

    //区分一下get和post，
    //get-直接用地址存
    //post-用参数拼接上地址存
    if (res.config.method === 'get') {
        console.log('config 是',res.config)
        cacheStore[res.config.url] = {
            ...res,
            expiredTime: Date.now() + 5 * 60 * 1000
        };
        // console.log(`${res.config.url} is `, cacheStore[res.config.url])
        
    } else if (res.config.method === 'post') {
        //存数据前，检查cacheStore是否已经存超过20个，如果超过了，则去掉一个再存
        //JSON.stringify() 生成的字符串在控制台打印时会显示转义符（如 \"），但实际存储的字符串中并没有转义符，只是双引号本身。
        console.log(typeof (res.config.url + JSON.stringify(res.config.data)))
        const processedStr = (res.config.url + JSON.stringify(res.config.data)).replace(/\\/g, '')
        cacheStore[processedStr] = {
            ...res,
            expiredTime: Date.now() + 5 * 60 * 1000
        };
    }

    return res;
})

//判断内存中的cahceStore中是否有url的值，并且判断是否超时
function hasCache(url) {  

    const cahceResult = cacheStore[url];

    if (cahceResult) {

        if (Date.now() < cahceResult.expiredTime) {
            return cahceResult
        } else {
            return false;
        }
    } else {
        return false;
    }
}


export default {
    // detail?id=1
    // detail?id=2
    get(url) {
        //没有缓存cache是一个false，有缓存cache就是缓存内容
        const cache = hasCache(url);
        if (cache) {
            return Promise.resolve(cache);
        } else {
            //真正的发请求
            return requestInstance.get(url);
        }
    },
    post(url, data) {
        // let str = '?'
        // for (let name in data) {
        //     str += name;
        //     str += "="
        //     str += data[name];
        // }
        const cache = hasCache(`${url}"${JSON.stringify(data)}"`);
        if (cache) {
            return Promise.resolve(cache);
        } else {
            return requestInstance.post(url, data);
        }
    }
}